package com.wxg.ch09.leetcode307;

public class NumArray {

    /**
     * sum[i] 存储前 i 个元素的和，
     * sum[0] = 0
     * sum[i] 存储 [0...i-1] 的和
     */
    private int[] sum;
    private int[] data;

    public NumArray(int[] nums) {
        data = new int[nums.length];
        for (int i = 0; i < nums.length; i++){
            data[i] = nums[i];
        }

        sum = new int[nums.length + 1];
        sum[0] = 0;
        for (int i = 1; i < sum.length; i++) {
            sum[i] = sum[i - 1] + nums[i -1];
        }
    }

    public void update(int index, int val) {
        data[index] = val;
        // 注意: sum.length > data.length
        // 所以下面的 `i < sum.length` 是可以保证一直成立的！
        for (int i = index + 1; i < sum.length; i++) {
            // 因为 sum[0] 存储的是 0 ，sum[1] ... 有一个元素的偏移!
            sum[i] = sum[i - 1] + data[i - 1];
        }
    }

    public int sumRange(int i, int j) {
        // sum[j + 1] : 存储的是 [0...j]   的元素和
        // sum[i]     : 存储的是 [0...i-1] 的元素和
        return sum[j + 1] - sum[i];
    }
}
